タグによるアクセス制御のロールをgcloudコマンドで付与する際の注意点

タグによるアクセス制御のロールをgcloudコマンドで付与する際の注意点

Clock Icon2024.09.12

はじめに

データアナリティクス事業本部のkobayashiです。

gloudコマンドのadd-iam-policy-bindingでプリンシパルにロールを付与する際にconditionの指定の仕方で少しハマったのでまとめます。

コマンド実行でハマった内容と解決策

失敗したコマンド実行例

実行しようとして失敗したコマンドは タグと条件付きアクセス | IAM のドキュメント | Google Cloud にある「名前空間と略称を利用する条件」をIAMにてロールを付与するコマンドになります。コマンドはタグキーenvのタグ値prodを持つリソースだけを読み取る条件付きロールになります。
このコマンドを以下の形で実行するとエラーが発生してしまいました。

$ gcloud projects add-iam-policy-binding example-project-id-1 \
	--member='user:test-user@gmail.com'\
	--role="roles/bigquery.dataViewer" \
	--condition="expression=resource.matchTag('123456789012/env', 'prod'),title=Access only to tag,description=Grants access only to resources with specified tag"

ERROR: (gcloud.projects.add-iam-policy-binding) argument --condition: valid keys are [None, description, expression, title]; received: 'prod')

Google Cloudのコンソール画面から同様のロールを追加してからgcloud projects get-iam-policyコマンドで出力された値が

- condition:
    description: Grants access only to resources with specified tag
    expression: resource.matchTag('123456789012/env','prod')
    title: Access only to tag

だったため--conditinオプションもこれをカンマ区切りで単純に結合すればよいかと誤認していました。

またタグキーだけの条件の下記のコマンドは問題なく成功していたため少し悩みました。

$ gcloud projects add-iam-policy-binding example-project-id-1 \
	--member='user:test-user@gmail.com'\
	--role="roles/bigquery.dataViewer" \
	--condition="expression=resource.hasTagKey('123456789012/env'),title=Access only to tag key,description=Grants access only to resources with specified tag key"

解決策

そこで改めてgcloud projects add-iam-policy-bindingのドキュメントを見返したところ--conditinオプションに以下の説明がありました。

If the condition expression includes a comma, use a different delimiter to separate the key-value pairs. Specify the delimiter before listing the key-value pairs. For example, to specify a colon (:) as the delimiter, do the following: --condition=^:^title=TITLE:expression=EXPRESSION. For more information, see https://cloud.google.com/sdk/gcloud/reference/topic/escaping.

https://cloud.google.com/sdk/gcloud/reference/projects/add-iam-policy-binding

これからわかった問題点はresource.matchTag('123456789012/env', 'prod')の条件の中にカンマ,が含まれていることでしたので gcloud topic escaping | Google Cloud CLI Documentation を参考に以下のように項目の区切りを^:^と先頭で指定してから区切りをカンマ,からコロン:に書き換えたところ問題なくコマンドが成功するようになりました。

$ gcloud projects add-iam-policy-binding example-project-id-1 \
	--member='user:test-user@gmail.com'\
	--role="roles/bigquery.dataViewer" \
	--condition="^:^expression=resource.matchTag('123456789012/env', 'prod'):title=Access only to tag:description=Grants access only to resources with specified tag"

これ以外の解決策としては--conditinオプションではなく--condition-from-filオプションで条件部分をファイルから読み込むことでも解決できます。

$ gcloud projects add-iam-policy-binding example-project-id-1 \
	--member='user:test-user@gmail.com'\
	--role="roles/bigquery.dataViewer" \
	--condition-from-file=policy.yaml
policy.yaml
description: Grants access only to resources with specified tag
expression: resource.matchTag('123456789012/env','prod')
title: Access only to tag

まとめ

gloudコマンドのadd-iam-policy-bindingでプリンシパルにロールを付与する際にconditionの中にカンマ,を含む条件がある場合の解決方法をまとめました。同じエラーで悩んでいる方のお役にたてれば幸いです。

最後まで読んで頂いてありがとうございました。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.